iT邦幫忙

0

【kintone】客製化入門-透過 Event Object 操作欄位時的注意事項

  • 分享至 

  • xImage
  •  

在 kintone 的客製化開發中,經常需要透過 Event Object 來操作欄位,包括取得和更新欄位值、限制欄位是否可編輯、以及在欄位下方顯示錯誤提示等。

使用 Event Object 操作欄位非常簡單,只需在事件處理器(Event Handler)中透過 event.record.欄位代碼 取得欄位物件,然後對其屬性進行修改,即可完成相關操作。

範例程式碼:

kintone.events.on('app.record.create.show', event => {
    const { record } = event
    
    // 取得欄位
    const fieldA = record.fieldA
    const fieldB = record.fieldB
    
    fieldA.value = 'N' // 將欄位 fieldA 的值設為 'N'
    fieldB.disabled = true // 禁止編輯欄位 fieldB
    
    return event
})

上述程式碼示範了如何修改欄位的值與屬性,但若遇到欄位代碼不存在的情況,就可能發生以下錯誤:

Uncaught TypeError: Cannot read properties of undefined (reading 'value')
Uncaught TypeError: Cannot set properties of undefined (setting 'disabled')

這是因為當 event.record.欄位代碼 不存在時,對應的欄位物件為 undefined,因此無法存取其屬性如 valuedisabled,導致程式碼拋出錯誤並中斷執行。

此外,若登入使用者不具備欄位的存取權限,Event Object 中也不會包含該欄位,這點在開發時需要格外注意。

善用可選串連運算子與條件判斷避免錯誤

kintone 的彈性設計讓使用者可以隨時依照需求調整應用程式內容,包含欄位和權限設置。然而,這些變更若未同步更新客製化程式碼,就可能引發錯誤。例如欄位代碼被修改、欄位被刪除、新增了欄位權限使部分使用者無法存取該欄位等,就是造成客製化程式碼出錯的常見原因。

因此,在操作欄位物件時,應加入條件判斷,避免因欄位不存在而中斷程式運行。

以下範例展示幾種解決方法:

範例一:使用可選串連運算子

kintone.events.on('...', event => {
  const { record } = event
  const fieldA = record.fieldA?.value || ''

  // ...
  return event
})

此寫法會在存取 record.fieldA.value 前,先檢查 record.fieldA 是否存在。如果不存在,則回傳 undefined,而不會拋出錯誤。後續可搭配 OR 運算子 || 設定預設值,確保程式正常運作。

範例二:檢查多個欄位並設置錯誤訊息

kintone.events.on('app.record.edit.submit', event => {
  const { record } = event
  const targetFields = ['fieldA', 'fieldB', 'fieldC']

  targetFields.forEach(field => {
    if (record[field]?.value === '-') {
      record[field].error = '請選擇項目'
    }
  })
  
  return event
})

此範例針對選項按鈕欄位進行必填檢查。由於選項按鈕不像下拉選單可以選擇未填作為預設值,如果要讓選項按鈕也有必填的效果,需自行定義未填值(如: '-'),並透過程式檢查。利用 forEach 方法可有效簡化邏輯,讓多個欄位的檢查變得更直觀。即使某欄位不存在,程式也能順利執行,避免錯誤。

範例三:根據條件動態禁用欄位

kintone.events.on('app.record.edit.show', event => {
  const { record } = event
  const progress = record.progress?.value

  const disableFields = fields => fields.forEach(field => {
    if (record[field]) {
      record[field].disabled = true
    }
  })

  if (progress === 'A') {
    disableFields(['fieldA', 'fieldB', 'fieldC'])
  } else {
    disableFields(['fieldD', 'fieldE'])
  }

  return event
})

此範例根據 progress 欄位的值動態決定需禁用的欄位。disableFields 函式負責檢查欄位是否存在,若存在則禁用。將重複邏輯抽象為函式,能提升程式碼的可讀性與可維護性。

結語

處理欄位操作時必須考量欄位不存在或存取權限不足的情況。透過可選串連運算子與條件判斷,可以有效避免錯誤,提升程式穩定性。進一步將重複邏輯模組化,則能大幅改善程式的易讀性與可擴充性,打造更穩健的客製化應用程式。透過這些技巧,不僅能提升開發效率,也能提供使用者更佳的體驗。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言